/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Movilizacion;

import Movilizacion.PickListMaterialConstruccion;
import commonsbeans.*;
import commonsbridges.MaterialConstruccionProveedor;
import commonsbridges.VoluntariosConstruccion;
import entities.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.*;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
import persistence.*;
import persistence.exceptions.PreexistingEntityException;
import persistence.exceptions.RollbackFailureException;

/**
 *
 * @author Felipe Corredor
 */
@ManagedBean
@ViewScoped
public class AsignacionTransporteMovilizacion implements Serializable {

    @ManagedProperty(value = "#{sessionBean}")
    private SessionBean sessionBean;
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;
    @ManagedProperty(value = "#{pickListMaterialConstruccion}")
    private PickListMaterialConstruccion pickListMaterialConstruccion;
    public MaterialConstruccion materialConstruccion = new MaterialConstruccion();
    public ProveedorConstruccionJpaController proveedorConstruccionJpaController = new ProveedorConstruccionJpaController();
    public ProveedorMaterialConstruccion proveedorMaterialConstruccion = new ProveedorMaterialConstruccion();
    public List<Construccion> listaConstrucciones = new ArrayList<Construccion>();
    private ConstruccionJpaController construccionJpaController = null;
    private EstadoConstruccionJpaController estadoConstruccionJpaController = null;
    public Construccion construccionSelected = new Construccion();
    private TipoVoluntarioJpaController tipoVoluntarioJpaController = null;
    public List<VoluntariosConstruccion> listaVoluntarios = new ArrayList<VoluntariosConstruccion>();
    private List<MaterialConstruccion> source, target;
    public List<MaterialConstruccion> listaMaterialesConstruccion = new ArrayList<MaterialConstruccion>();
    private MaterialConstruccionJpaController materialConstruccionJpaController = null;
    public List<ConstruccionMaterialConstruccion> listaModificableMaterialesConstruccion = new ArrayList<ConstruccionMaterialConstruccion>();
    private ConstruccionMaterialConstruccionJpaController construccionMaterialConstruccionJpaController = null;
    private BarrioConstruccionTipoVoluntarioJpaController barrioConstruccionTipoVoluntarioJpaController = null;

    public AsignacionTransporteMovilizacion() {
    }

    @PostConstruct
    public void init() {
        if (sessionBean.getUsuarioActual() != null) {
            initControllers();
            cargarConstrucciones();
            cargarTiposVoluntario();
            cargarMaterialesConstruccion();
            cargarMaterialesSourceConstruccion();
        }

    }

    public void actualizarInformacion() {
        cargarConstrucciones();
        cargarMaterialesConstruccion();
        cargarMaterialesSourceConstruccion();
    }

    private void cargarConstrucciones() {
        EstadoConstruccion ec = estadoConstruccionJpaController.findEstadoConstruccion(1);
        listaConstrucciones.clear();
        listaConstrucciones = construccionJpaController.findConstruccionCiudadActivas(sessionBean.getUsuarioActual().getCiudadIdCiudad().getIdCiudad(), ec);

    }

    public void cargarMaterialesSourceConstruccion() {
        source = new ArrayList<MaterialConstruccion>();
        source = listaMaterialesConstruccion;
        target = new ArrayList<MaterialConstruccion>();
        pickListMaterialConstruccion.setMaterialConstruccion(new DualListModel<MaterialConstruccion>());
        pickListMaterialConstruccion.getMaterialConstruccion().setSource(source);
        pickListMaterialConstruccion.getMaterialConstruccion().setTarget(target);
    }

    public void handleTransfer(TransferEvent event) {
        event.getItems();
        boolean entro = false;
        boolean entroInterno = false;
        if (listaModificableMaterialesConstruccion.isEmpty() && event.isAdd()) {
            for (int i = 0; i < event.getItems().size(); i++) {
                ConstruccionMaterialConstruccion cmc = new ConstruccionMaterialConstruccion();
                MaterialConstruccion mc = (MaterialConstruccion) event.getItems().get(i);
                cmc.setIdMaterialConstruccionConstruccionMaterialConstruccion(mc);
                cmc.setCantidadMaterialAsignadaConstruccion(0);
                listaModificableMaterialesConstruccion.add(cmc);
            }
            entro = true;
        }
        List<ConstruccionMaterialConstruccion> listaAEliminar = new ArrayList<ConstruccionMaterialConstruccion>();
        List<ConstruccionMaterialConstruccion> listaAAgregar = new ArrayList<ConstruccionMaterialConstruccion>();
        if (!listaModificableMaterialesConstruccion.isEmpty() && !event.getItems().isEmpty()) {
            for (int j = 0; j < listaModificableMaterialesConstruccion.size(); j++) {

                ConstruccionMaterialConstruccion cmc1 = new ConstruccionMaterialConstruccion();
                cmc1 = listaModificableMaterialesConstruccion.get(j);
                if (event.isRemove()) {
                    for (int k = 0; k < event.getItems().size(); k++) {

                        MaterialConstruccion mc = (MaterialConstruccion) event.getItems().get(k);
                        if (cmc1.getIdMaterialConstruccionConstruccionMaterialConstruccion().getIdMaterialConstruccion() == mc.getIdMaterialConstruccion()) {
                            listaAEliminar.add(cmc1);
                        }
                    }
                } else {
                    if (!entro && !entroInterno) {
                        for (int h = 0; h < event.getItems().size(); h++) {
                            MaterialConstruccion mc1 = (MaterialConstruccion) event.getItems().get(h);
                            ConstruccionMaterialConstruccion cmc2 = new ConstruccionMaterialConstruccion();
                            cmc2.setIdMaterialConstruccionConstruccionMaterialConstruccion(mc1);
                            cmc2.setCantidadMaterialAsignadaConstruccion(0);
                            listaAAgregar.add(cmc2);
                            entroInterno = true;
                        }
                    }



                }


            }
        }
        if (!listaAEliminar.isEmpty()) {
            for (int g = 0; g < listaAEliminar.size(); g++) {
                if (!listaModificableMaterialesConstruccion.isEmpty()) {
                    for (int d = 0; d < listaModificableMaterialesConstruccion.size(); d++) {
                        if (listaModificableMaterialesConstruccion.get(d).getIdMaterialConstruccionConstruccionMaterialConstruccion().getIdMaterialConstruccion() == listaAEliminar.get(g).getIdMaterialConstruccionConstruccionMaterialConstruccion().getIdMaterialConstruccion()) {
                            listaModificableMaterialesConstruccion.remove(d);
                            break;
                        }
                    }
                }
            }
        }
        if (!entro && !listaAAgregar.isEmpty()) {
            for (int g = 0; g < listaAAgregar.size(); g++) {
                listaModificableMaterialesConstruccion.add(listaAAgregar.get(g));
            }
        }




    }

    private void cargarMaterialesConstruccion() {
        listaMaterialesConstruccion.clear();
        listaMaterialesConstruccion = materialConstruccionJpaController.getMaterialPorCiudadHabilitadosMovilizacion(sessionBean.getUsuarioActual().getCiudadIdCiudad());
    }

    private void cargarTiposVoluntario() {
        listaVoluntarios = new ArrayList<VoluntariosConstruccion>();
        for (int i = 0; i < tipoVoluntarioJpaController.findTipoVoluntarioEntities().size(); i++) {
            VoluntariosConstruccion voluntariosConstruccion = new VoluntariosConstruccion();
            voluntariosConstruccion.setCantidadVoluntarios(0);
            voluntariosConstruccion.setTipoVoluntario(tipoVoluntarioJpaController.findTipoVoluntarioEntities().get(i));
            listaVoluntarios.add(voluntariosConstruccion);
        }
    }

    public void guardarMaterialConstruccion() throws Exception {
        boolean valoresCeros = false;
        for (int i = 0; i < listaModificableMaterialesConstruccion.size(); i++) {

            if (listaModificableMaterialesConstruccion.get(i).getCantidadMaterialAsignadaConstruccion()
                    <= listaModificableMaterialesConstruccion.get(i).getIdMaterialConstruccionConstruccionMaterialConstruccion().getCantidadDisponible()
                    && listaModificableMaterialesConstruccion.get(i).getCantidadMaterialAsignadaConstruccion() >= 1) {
            } else {
                valoresCeros = true;
            }

        }
        if (valoresCeros) {
            showErrorMessage("La cantidad debe asignada debe ser mayor o igual a 1 y menor o igual a la cantidad disponible");


        } else {
            int maxMaterial = construccionMaterialConstruccionJpaController.getIdMax() + 1;
            int maxVoluntari = barrioConstruccionTipoVoluntarioJpaController.getIdMax() + 1;

            for (int i = 0; i < listaModificableMaterialesConstruccion.size(); i++) {
                try {
                    ConstruccionMaterialConstruccion cmc = listaModificableMaterialesConstruccion.get(i);
                    cmc.setIdConstruccionConstruccionMaterialConstruccion(construccionSelected);
                    if (cmc.getIdMaterialConstruccionConstruccionMaterialConstruccion().getTipoMaterialIdTipoMaterial().getIdTipoMaterial() == 3) {
                        MaterialConstruccion mc = cmc.getIdMaterialConstruccionConstruccionMaterialConstruccion();
                        mc.setCantidadDisponible(cmc.getIdMaterialConstruccionConstruccionMaterialConstruccion().getCantidadDisponible() - cmc.getCantidadMaterialAsignadaConstruccion());
                        mc.setCantidadTotal(cmc.getIdMaterialConstruccionConstruccionMaterialConstruccion().getCantidadTotal() - cmc.getCantidadMaterialAsignadaConstruccion());
                        materialConstruccionJpaController.edit(mc);
                    }

                    cmc.setIdConstruccionMaterialConstruccion(maxMaterial);
                    maxMaterial++;
                    construccionMaterialConstruccionJpaController.create(cmc);
                } catch (PreexistingEntityException ex) {
                    Logger.getLogger(AsignacionTransporteMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (RollbackFailureException ex) {
                    Logger.getLogger(AsignacionTransporteMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(AsignacionTransporteMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
//            for (int j = 0; j < listaVoluntarios.size(); j++) {
//                try {
//                    VoluntariosConstruccion tv = listaVoluntarios.get(j);
//                    BarrioConstruccionTipoVoluntario bctv = new BarrioConstruccionTipoVoluntario();
//                    bctv.setCantidadBarrioConstruccionTipoVoluntario(tv.getCantidadVoluntarios());
//                    bctv.setConstruccionIdConstruccion(construccionSelected);
//                    bctv.setIdBarrioConstruccionTipoVoluntario(maxVoluntari);
//                    bctv.setTipoVoluntarioIdTipoVoluntario(tv.getTipoVoluntario());
//                    maxVoluntari++;
//                    barrioConstruccionTipoVoluntarioJpaController.create(bctv);
//                } catch (PreexistingEntityException ex) {
//                    Logger.getLogger(AsignacionTransporteMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
//                } catch (RollbackFailureException ex) {
//                    Logger.getLogger(AsignacionTransporteMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
//                } catch (Exception ex) {
//                    Logger.getLogger(AsignacionTransporteMovilizacion.class.getName()).log(Level.SEVERE, null, ex);
//                }
//
//            }


            limpiarCampos();
            showSuccessMessage("Se ha guardado el material de manera éxitosa");
        }


    }

    public void showSuccessMessage(String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Operación exitosa", detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    /**
     * Muestra mensajes para notificar error en la transacción
     *
     * @param detail Detalle del error
     */
    public void showErrorMessage(String detail) {
        Logger.getLogger("Error en  bean").log(Level.SEVERE, detail, detail);
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    private void limpiarCampos() {
        cargarMaterialesConstruccion();
        listaModificableMaterialesConstruccion.clear();
        listaVoluntarios.clear();
        construccionSelected = new Construccion();
        cargarTiposVoluntario();
        cargarMaterialesSourceConstruccion();
    }

    public ProveedorMaterialConstruccion getProveedorMaterialConstruccion() {
        return proveedorMaterialConstruccion;
    }

    public void setProveedorMaterialConstruccion(ProveedorMaterialConstruccion proveedorMaterialConstruccion) {
        this.proveedorMaterialConstruccion = proveedorMaterialConstruccion;
    }

    public SessionBean getSessionBean() {
        return sessionBean;
    }

    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }

    public MaterialConstruccion getMaterialConstruccion() {
        return materialConstruccion;
    }

    public void setMaterialConstruccion(MaterialConstruccion materialConstruccion) {
        this.materialConstruccion = materialConstruccion;
    }

    public Construccion getConstruccionSelected() {
        return construccionSelected;
    }

    public void setConstruccionSelected(Construccion construccionSelected) {
        this.construccionSelected = construccionSelected;
    }

    public List<Construccion> getListaConstrucciones() {
        return listaConstrucciones;
    }

    public void setListaConstrucciones(List<Construccion> listaConstrucciones) {
        this.listaConstrucciones = listaConstrucciones;
    }

    public ApplicationBean getApplicationBean() {
        return applicationBean;
    }

    public void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }

    public List<VoluntariosConstruccion> getListaVoluntarios() {
        return listaVoluntarios;
    }

    public void setListaVoluntarios(List<VoluntariosConstruccion> listaVoluntarios) {
        this.listaVoluntarios = listaVoluntarios;
    }

    public PickListMaterialConstruccion getPickListMaterialConstruccion() {
        return pickListMaterialConstruccion;
    }

    public void setPickListMaterialConstruccion(PickListMaterialConstruccion pickListMaterialConstruccion) {
        this.pickListMaterialConstruccion = pickListMaterialConstruccion;
    }

    public List<ConstruccionMaterialConstruccion> getListaModificableMaterialesConstruccion() {
        return listaModificableMaterialesConstruccion;
    }

    public void setListaModificableMaterialesConstruccion(List<ConstruccionMaterialConstruccion> listaModificableMaterialesConstruccion) {
        this.listaModificableMaterialesConstruccion = listaModificableMaterialesConstruccion;
    }

    public void initControllers() {
        FacesContext context = FacesContext.getCurrentInstance();
        construccionJpaController = (ConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "construccionJpaController");
        estadoConstruccionJpaController = (EstadoConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "estadoConstruccionJpaController");
        tipoVoluntarioJpaController = (TipoVoluntarioJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "tipoVoluntarioJpaController");
        materialConstruccionJpaController = (MaterialConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "materialConstruccionJpaController");
        construccionMaterialConstruccionJpaController = (ConstruccionMaterialConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "construccionMaterialConstruccionJpaController");
        barrioConstruccionTipoVoluntarioJpaController = (BarrioConstruccionTipoVoluntarioJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "barrioConstruccionTipoVoluntarioJpaController");
    }
}
